<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>原型链继承-方式1</h1>
    <p>该方式采用Object.setPrototypeOf()方法替换子类的原型。</p>
    <p>子类实例可以直接调用父类原型上的属性（方法），实现了对父类原型属性的继承。</p>
    <p>父类不能调用子类原型上的方法（单继承，可取）。</p>
    <h2>缺点</h2>
    <ul>
        <li>子类无法继承父类内部定义（构造方法中）的属性。</li>
    </ul>
    <script>
        function Parent(name) {
            this.parentName = name;
            this.age = 35;
        }

        Parent.prototype.sayParentName = function() {
            console.log("sayParentName：",this.parentName);
        }

        function Child() {
            this.childName = "childName";
        }

        // 把第一个原型，改为第二个原型
        Object.setPrototypeOf(Child.prototype,Parent.prototype);

        Child.prototype.sayChildName = function() {
            console.log("sayChildName：",this.childName);
        }

        let parent = new Parent("parentName");
        console.log(parent.parentName); // parentName
        parent.sayParentName(); // 正常调用
        // parent.sayChildName(); // 无法调用（正确）
        console.log(parent.childName); // undefined（正确）

        console.log("---------------child-------------");

        let child = new Child();
        console.log(child.age); // undefined（无法访问父类内部属性）
        child.sayParentName(); // 正常调用（但是获取不到this.parentName）
        child.sayChildName(); // 正常调用
        
        console.log(child instanceof Parent); // true

    </script>
</body>
</html>